<html>
    <head>
        <title>数据播种贡献者服务  IDataSeedContributor</title>
    </head>
    <body>
        <script>
            /*
                        三、数据播种逻辑  IDataSeedContributor 接口

                                IDataSeedContributor 接口定义了数据播种逻辑，是为了向数据库播种数据而应该实现的接口。

                                eg:  如果没有书，则向数据库播种一本书：

                                        using System;
                                        using System.Threading.Tasks;
                                        using Volo.Abp.Data;
                                        using Volo.Abp.DependencyInjection;
                                        using Volo.Abp.Domain.Repositories;
                                        using Volo.Abp.Guids;

                                        namespace Acme.BookStore
                                        {
                                            // 数据播种贡献者类，用于向数据库播种数据。
                                            public class BookStoreDataSeedContributor: IDataSeedContributor, ITransientDependency
                                            {
                                                private readonly IRepository<Book, Guid> _bookRepository; // book存储
                                                private readonly IGuidGenerator _guidGenerator; // 生成可排序Guid
                                                private readonly ICurrentTenant _currentTenant; // 档期租户

                                                public BookStoreDataSeedContributor(
                                                    IRepository<Book, Guid> bookRepository,
                                                    IGuidGenerator guidGenerator,
                                                    ICurrentTenant currentTenant)
                                                {
                                                    _bookRepository = bookRepository;
                                                    _guidGenerator = guidGenerator;
                                                    _currentTenant = currentTenant;
                                                }
                                                
                                                //  播种方法
                                                public async Task SeedAsync(DataSeedContext context)
                                                {
                                                    // 切换到当前租户（如果有）
                                                    using (_currentTenant.Change(context?.TenantId))
                                                    {
                                                        if (await _bookRepository.GetCountAsync() > 0)
                                                        {
                                                            return;
                                                        }

                                                        var book = new Book(
                                                            id: _guidGenerator.Create(),
                                                            name: "The Hitchhiker's Guide to the Galaxy",
                                                            type: BookType.ScienceFiction,
                                                            publishDate: new DateTime(1979, 10, 12),
                                                            price: 42
                                                        );

                                                        await _bookRepository.InsertAsync(book);
                                                    }
                                                }
                                            }
                                        }

                                IDataSeedContributor定义了SeedAsync方法来执行数据种子逻辑。

                                通常ABP会检查数据库中种子是否已经存在。

                                你可以注入任何服务，并执行播种数据所需的任何逻辑。


                                ★、数据种子上下文  DataSeedContext

                                        DataSeedContext包含TenantId，因此你可以在插入数据或基于租户执行自定义逻辑时使用此值。

                                        DataSeedContext还包含名称-值样式配置参数，用于从IDataSeeder传递给播种机贡献者。
                    */
        </script>
    </body>
</html>